/**
 * 即创建一个仅用于封装继承过程的函数
 * 该函数在内部以某种方式来增强对象,最后再像真的是它做了所有工作一样返回对象.
 * 
 * 应该归类为 渐进式增强对象
 * 主要是通过 抽离继承逻辑 并 封装为函数 ，在函数中创建一个空函数并将其原型指向传来的对象
 * 最后通过new 创建该函数实例对象并返回
*/


function object(o) {
  function F() { }  // 首先创建一个空的函数
  F.prototype = o;  // 将这个传来的o赋予在这个函数的原型上
  return new F();   // 返回这个子类的实例对象 这样可以保证 clone.__proto__ == F.prototype
}

function createAnother(original) {
  var clone = object(original); 
  // 通过调用object函数创建一个新对象 --- 继承自original
  // 其实上方继承说法不太准确 实际上是把对象绑定到新对象的原型上来实现假性继承
  clone.sayHi = function () {   // 以某种方式来增强这个对象 --- 给新的子类设置一些属于自己的私有方法
    alert("hi");
  };
  return clone;                 // 返回这个对象
}

var a = {
  name: 'wang'
}
var b = createAnother(a)          // 获取到返回的对象
console.log(b)